﻿------------------------------------------------------------------------------------------------------------------------
-------------------------------------------pca_socios.tipos_cliente-----------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION pca_socios.fn_get_list_tipos_cliente()RETURNS SETOF pca_socios.tipos_cliente AS
$$
DECLARE
	_row pca_socios.tipos_cliente%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_socios.tipos_cliente
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

------------------------------------------------------------------------------------------------------------------------
------------------------------------pca_socios.tipo_cliente_tipos_documentos_identidad-------------------------------
------------------------------------------------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION pca_socios.fn_get_list_tipos_documentos_identidad(integer --tipo_cliente_id $1
									     )RETURNS SETOF pca_socios.vw_tipo_cliente_tipos_documentos_identidad AS
$$
DECLARE
	_row pca_socios.vw_tipo_cliente_tipos_documentos_identidad%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_socios.vw_tipo_cliente_tipos_documentos_identidad
		WHERE
			tipo_cliente_id = $1 AND
			activo = true
		ORDER BY
			tipo_documento_identidad_id ASC
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;

------------------------------------------------------------------------------------------------------------------------
-------------------------------------------pca_socios.clientes----------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION pca_socios.fn_add_cliente(varchar,--empresa_id $1
						     varchar,--oficina_id $2
						     integer,--tipo_cliente_id $3
						     bigint,--sesion_id $4
						     varchar,--tipo_documento_identidad_id $5
						     varchar,--numero_documento_identidad $6
						     varchar,--nombre $7
						     varchar,--pais_id $8
						     varchar,--direccion $9
						     varchar --email $10
						     )RETURNS bigint AS
$$
DECLARE
	_id bigint;
BEGIN
	INSERT INTO pca_socios.clientes
		(empresa_id,
		oficina_id,
		tipo_cliente_id,
		sesion_id,
		tipo_documento_identidad_id,
		numero_documento_identidad,
		nombre,
		pais_id,
		direccion,
		email)
	VALUES
		($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);

	RETURN pca_global.fn_pseudo_encrypt_bigint(currval('pca_socios.seq_cliente_id')::integer);
EXCEPTION
	WHEN SQLSTATE '23505' THEN --Ya existe cliente posiblemente este como eliminado en la base de datos
		SELECT 
			cliente_id 
		INTO
			_id
		FROM 
			pca_socios.clientes 
		WHERE 
			tipo_documento_identidad_id = $5 AND 
			numero_documento_identidad = $6 AND 
			pais_id = $8;

		IF FOUND THEN
			UPDATE pca_socios.clientes SET
				tipo_cliente_id = $3,
				sesion_id = $4,
				nombre = $7,
				direccion = $9,
				email = $10,
				eliminado = false
			WHERE
				empresa_id = $1 AND
				cliente_id = _id;

			RETURN _id;
		ELSE
			RAISE EXCEPTION 'Ocurrio un error no esperado, comuniquese con el centro de computo';
		END IF;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_socios.fn_update_cliente(varchar,--empresa_id $1
							bigint,--cliente_id $2
							integer,--tipo_cliente_id $3
							bigint,--sesion_id $4
							varchar,--tipo_documento_identidad_id $5
							varchar,--numero_documento_identidad $6
							varchar,--nombre $7
							varchar,--pais_id $8
							varchar,--direccion $9
							varchar --email $10
							)RETURNS void AS
$$
BEGIN
	UPDATE pca_socios.clientes SET
		tipo_cliente_id = $3,
		sesion_id = $4,
		tipo_documento_identidad_id = $5,
		numero_documento_identidad = $6,
		nombre = $7,
		pais_id = $8,
		direccion = $9,
		email = $10,
		eliminado = false --La actualizacion desactiva el estado eliminado
	WHERE
		empresa_id = $1 AND
		cliente_id = $2;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_socios.fn_del_cliente(varchar,--empresa_id $1
						     bigint --cliente_id $2
						     )RETURNS void AS
$$
BEGIN
	UPDATE pca_socios.clientes SET
		eliminado = true
	WHERE
		empresa_id = $1 AND
		cliente_id = $2;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_socios.fn_get_list_cliente(integer,--start $1
							  integer,--limit $2
							  varchar,--empresa_id $3
							  varchar --filtro(nombre-direccion-documento de identidad) $4
							  )RETURNS SETOF refcursor AS
$$
DECLARE
	cursor_result refcursor;
	cursor_totalrows refcursor;
BEGIN
	OPEN cursor_result FOR
		SELECT
			*
		FROM
			pca_socios.vw_clientes
		WHERE
			empresa_id = $3 AND
			eliminado = false AND
			lower(pca_global.fn_ascii(concat(numero_documento_identidad,nombre,direccion))) LIKE '%'|| lower(pca_global.fn_ascii($4)) ||'%'
		ORDER BY
			nombre ASC LIMIT $2 OFFSET $1;
	RETURN NEXT cursor_result;

	OPEN cursor_totalrows FOR
		SELECT
			*
		FROM
			pca_socios.vw_clientes
		WHERE
			empresa_id = $3 AND
			eliminado = false AND
			lower(pca_global.fn_ascii(concat(numero_documento_identidad,nombre,direccion))) LIKE '%'|| lower(pca_global.fn_ascii($4)) ||'%';
	RETURN NEXT cursor_totalrows;
END;
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION pca_socios.fn_get_cliente(varchar,--empresa_id $1
						     bigint --cliente_id $2
						     )RETURNS SETOF pca_socios.vw_clientes AS
$$
DECLARE
	_row pca_socios.vw_clientes%ROWTYPE;
BEGIN
	FOR _row IN
		SELECT
			*
		FROM
			pca_socios.vw_clientes
		WHERE
			empresa_id = $1 AND
			cliente_id = $2
	LOOP
		RETURN NEXT _row;
	END LOOP;
END;
$$
LANGUAGE plpgsql;